/*
 * AplPrincipal.java
 * 
 * Projeto: Kruskal - SRAC
 * LEDS - Laboratório de Engenharia e Desenvolvimento de Software
 * IFES - Instituto Federal do Espírito Santo - Campus Serra.
 */
package srac.controleatividades.cgt;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import srac.controleatividades.cdp.Aluno;
import srac.controleatividades.cdp.Funcionario;
import srac.controleatividades.cdp.TipoUsuario;
import srac.controleatividades.cdp.Usuario;
import srac.controleatividades.cgd.AlunoDAOJPA;
import srac.controleatividades.cgd.FuncionarioDAOJPA;
import util.utilitarioExceptions.SracException;
import util.utilitarioPersistencia.DAO;
import util.utilitarioPersistencia.DAOFactory;

public class AplPrincipal {

    private DAO apDaoUsuario = DAOFactory.obterDAO(Usuario.class);
    private DAO apDaoAluno = DAOFactory.obterDAO(Aluno.class);
    private DAO apDaoFuncionario = DAOFactory.obterDAO(Funcionario.class);
    public static AplPrincipal instance = null;

    public static AplPrincipal getInstance() {
        if (instance == null) {
            instance = new AplPrincipal();
        }
        return instance;
    }
    
    public AplPrincipal(){

    }
    
    /**
     * Verifica se o login e senha estão cadastrados em algum Usuário
     * @param nome
     * @param senha
     * @throws Exception
     * @return O usuário caso o login e senha estejam corretos ou Null caso não estejam corretos
     */
    
    public Usuario validarUsuario(String nome, String senha) throws Exception {
        List<Usuario> l = obterUsuarios();
        String senhaCrip = Usuario.gerarHashCode(senha);

        for (int i = 0; i < l.size(); i++) {
            if ((l.get(i).getLogin().toLowerCase().equals(nome.toLowerCase()) && l.get(i).getSenha().equals(senhaCrip))&&l.get(i).getAtivo()) {
                return l.get(i);
            }
        }
        return null;
    }
    
    /**
     * Verifica se existe um Usuário com o login passado por parametro
     * @param nome
     * @return O usuário caso seja encontrado algum ou Null caso contrário
     * @throws Exception 
     */

    public Usuario validarUsuario(String nome) throws Exception {
        List<Usuario> l = obterUsuarios();

        for (int i = 0; i < l.size(); i++) {
            if (l.get(i).getLogin().toLowerCase().equals(nome.toLowerCase())) {
                return l.get(i);
            }
        }

        return null;
    }


    /**
     * Valida o login e senha do usuário
     * @param login
     * @param senha
     * @return O usuário com o mesmo login e senha
     * @throws Exception 
     */
    public Usuario login(String login, String senha) throws Exception {
        return validarUsuario(login, senha);
    }
    
    /**
     * Inclui um novo Usuário
     * @param args
     * @return O Usuário incluido
     * @throws Exception 
     */

    public Usuario incluirUsuario(ArrayList<Object> args) throws Exception {
        Usuario usuario = new Usuario();
        usuario.setLogin((String) args.get(0));
        usuario.setSenhaCriptografar((String) args.get(1));
        usuario.setTipo((TipoUsuario) args.get(2));
        usuario.setAtivo(true);

        usuario = (Usuario) apDaoUsuario.salvar(usuario);
        return usuario;
    }
    
    /**
     * Altera o Usuário
     * @param usuario
     * @return o Usuário alterado
     * @throws Exception 
     */

    public Usuario alterarUsuario(Usuario usuario) throws Exception {
        usuario.setSenhaCriptografar(usuario.getSenha());

        return (Usuario) apDaoUsuario.salvar(usuario);
    }
    
    /**
     * Apaga um Usuário
     * @param usuario
     * @return Verdadeiro caso seja possível apagar ou Falso caso contrário
     * @throws Exception 
     */

    public boolean apagarUsuario(Usuario usuario) throws Exception {
        if (usuario.getTipo() != TipoUsuario.ADMINISTRADOR) {
            apDaoUsuario.excluir(usuario);
            return true;
        } 
        else {
            return false;
        }
    }
    
    /**
     * Obtem todos os Usuários cadastrados
     * @return Uma lista de Usuários
     * @throws Exception 
     */

    public List<Usuario> obterUsuarios() throws Exception {
        return (List<Usuario>) apDaoUsuario.obter(Usuario.class);
    }
    
    /**
     * Obtem o Aluno pelo Usuário
     * @param u
     * @return O aluno
     */
    public Aluno obterAluno(Usuario u) {
        return ((AlunoDAOJPA) apDaoAluno).obter(u);
    }
    
    /**
     * Obtem o Funcinário pelo Usuário
     * @param u
     * @return O Funcionário
     */
    

    public Funcionario obterFuncionario(Usuario u) {
        return ((FuncionarioDAOJPA) apDaoFuncionario).obter(u);
    }
    
    /**
     * Modifica a senha do usuário
     * @param list
     * @return 0 caso a senha antiga, a senha nova e a confirmação estejam corretas, 1 caso a confirmação esteja incorreta e 
     * 2 caso a senha antiga esteja incorreta
     * @throws Exception 
     */

    public int verificarSenha(ArrayList<Object> list) throws Exception {
        String antigaSenha = (String) list.get(0);
        antigaSenha = Usuario.gerarHashCode(antigaSenha); //Transforma a senha antiga recebida pelo usuario para hashcode, para ser comparada com a q está no BD
        String novaSenha = (String) list.get(1);
        String confirmarSenha = (String) list.get(2);
        Usuario usuario = (Usuario) list.get(3);
        
        //comparando se a senha atual esta correta
        if(usuario.getSenha().equals(antigaSenha))
        {
            if(novaSenha.equals(confirmarSenha))
            {
                usuario.setSenhaCriptografar(novaSenha);
                apDaoUsuario.salvar(usuario);
                return 0; //Todas senhas conferem
            }                 
            else return 1; //A confirmação está incorreta
        }
        return 2; //A senha antiga está incorreta
    }


}
